接口中的java继承
我有两个界面:
public interface EventListener {
<T extends Data> T modify(T data);
public static class Data {
}
}
以及:
public interface ServerInfoEventListener extends EventListener {
// This works
@Override ServerInfoData modify(Data data);
// This doesn't work!
@Override ServerInfoData modify(ServerInfoData data);
public static class ServerInfoData extends Data {
public ServerInfoData(String motd, int playerCount, int maxPlayers) {
this.motd = motd;
this.playerCount = playerCount;
this.maxPlayers = maxPlayers;
}
public String motd;
public int playerCount;
public int maxPlayers;
}
}
从评论中可以看出,modify(ServerInfoData data)
没有编译。为什么不呢?我该怎么解决呢ServerInfoData
扩展了{
# 1 楼答案
正如在接口
EventListener
方法modify
中声明的那样,需要Data
(或任何子类)类型的参数ServerInfoData modify(ServerInfoData data);
接受类型为ServerInfoData
的参数,但接口中的定义表示“它应该接受任何碰巧具有类型为Data
的超类的参数”,这意味着子类中方法的参数类型与接口中声明的参数类型不匹配考虑这个例子:
问题是:没有方法实现来处理
AnotherData
,但应该有,因为EventListener
这样说ServerInfoData modify(ServerInfoData data)
不能接受,因为AnotherData
不是ServerInfoData
的实例希望这有帮助
# 2 楼答案
我无法充分解释它无法工作的具体技术原因,但我可以解释修复方法
接口应该在类级别而不是方法级别使用泛型。我们还需要将
Data
移出EventListener
(由于creation deadlock):# 3 楼答案
不起作用,因为它实际上不重写
EventListener.modify
,因为它不接受Data
的任何其他子类,而不是ServerInfoData
(和其子类)您要么必须处理所有
Data
类型,要么使接口本身通用,而不仅仅是一种方法:# 4 楼答案
重写超级方法时,不能缩小泛型类型的范围
这个来自接口的方法接受
Data
和Data
的任何子类但当你覆盖它时,就像:
然后,您的方法不能与扩展
Data
类的ServerInfoData
类同级,因此它会破坏重写的约定